#include"blockqueue.hpp"
#include<unistd.h>
#include<string>
#include"task.hpp"

using func_t=std::function<void()>;
blockqueuemoduer::blockqueue<func_t> bq;
void* productor(void* arg)//生产者线程执行的方法
{
    while(true)
    {
        sleep(1);
        bq.enterqueue(task1);
    }
    return nullptr;
}

void* consumer(void*arg)//消费者线程执行的方法
{
    std::string name=static_cast<const char*>(arg);
    func_t data;
    while(true)
    {
        bq.pop(&data);
        data();
        //printf("%d+%d=%d",data->a(),data->b(),data->result());
    }
    return nullptr;
}

int main()
{
    srand((unsigned int)time(nullptr)^::getpid());
    pthread_t p1;//生产者线程
    // pthread_t p2;//生产者线程
    pthread_t c1;//消费者线程
    // pthread_t c2;//消费者线程
    // pthread_t c3;//消费者线程

    pthread_create(&p1,nullptr,productor,(void*)"thread-1");
    // pthread_create(&p2,nullptr,productor,(void*)"thread-1");
    pthread_create(&c1,nullptr,consumer,(void*)"thread-1");
    // pthread_create(&c2,nullptr,consumer,(void*)"thread-1");
    // pthread_create(&c3,nullptr,consumer,(void*)"thread-1");

    while(true)
    {
        sleep(1);
    }

    pthread_join(p1,nullptr);
    // pthread_join(p2,nullptr);
    pthread_join(c1,nullptr);
    // pthread_join(c2,nullptr);
    // pthread_join(c3,nullptr);
    return 0;
}